package com.example.test3;

import java.time.*;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.zone.ZoneRules;

public class PhoneBillCalculator {


        private static boolean isDayLightSaving(LocalDateTime dateTime) {
            ZoneId zoneId = ZoneId.of("America/New_York");
            ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
            ZoneRules zoneRules = zoneId.getRules();

            if (zoneRules.isDaylightSavings(zonedDateTime.toInstant())) {
                return true;
            } else {
                return false;
            }
        }
    /**
     * 判断是否为春季夏令时转换日
     */
    private static boolean isSpringDST(LocalDateTime dateTime) {
        // 3月的某个星期日，具体日期可能因地区而异
        // 这里假设是3月的第二个星期日
        LocalDateTime dstStart = LocalDateTime.of(dateTime.getYear(), Month.MARCH, 1, 0, 0)
                .with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY)); // 3月的第二个星期日
        return dateTime.getMonth() == Month.MARCH &&
                dateTime.getDayOfWeek() == DayOfWeek.SUNDAY &&
                dateTime.toLocalDate().equals(dstStart.toLocalDate()) &&
                dateTime.getHour() == 2; // 2:00:00
    }

    /**
     * 判断是否为秋季夏令时转换日
     */
    private static boolean isFallDST(LocalDateTime dateTime) {
        return dateTime.getMonth() == Month.NOVEMBER &&
                dateTime.getDayOfWeek() == java.time.DayOfWeek.SUNDAY &&
                dateTime.getDayOfMonth() <= 7 && // 11月的第一个星期日
                dateTime.getHour() == 2; // 2:00:00
    }

    /**
     * 计算通话时长（分钟），考虑夏令时转换和不足1分钟按1分钟计算
     */
    public static long calculateCallDuration(LocalDateTime startTime, LocalDateTime endTime) {
            if (startTime == null || endTime == null) {
                throw new IllegalArgumentException("开始时间和结束时间不能为空");
            }
            if (endTime.isBefore(startTime)) {
                throw new IllegalArgumentException("结束时间不能早于开始时间");
            }

        long seconds = ChronoUnit.SECONDS.between(startTime, endTime);

            if(seconds ==0 || seconds > 30*60*60){
                throw new IllegalArgumentException("通话时长不合法");
            }


            // 处理春季转换（时间跳快1小时）
            if (isDayLightSaving(endTime)) {
                if (startTime.isBefore(LocalDateTime.of(startTime.getYear(), Month.MARCH, startTime.getDayOfMonth(), 2, 0))) {
                    // 通话开始时间在2:00:00之前
                    if (endTime.isAfter(LocalDateTime.of(startTime.getYear(), Month.MARCH, startTime.getDayOfMonth(), 3, 0))) {
                        // 通话结束时间在3:00:00之后
                        seconds -= 3600; // 减去跳过的1小时（3600秒）
                    }
                }
            }

            // 处理秋季转换（时间跳慢1小时）
            if (isFallDST(startTime)) {
                if (startTime.isBefore(LocalDateTime.of(startTime.getYear(), Month.NOVEMBER, startTime.getDayOfMonth(), 3, 0))) {
                    // 通话开始时间在3:00:00之前
                    if (endTime.isAfter(LocalDateTime.of(startTime.getYear(), Month.NOVEMBER, startTime.getDayOfMonth(), 3, 0))) {
                        // 通话结束时间在3:00:00之后
                        seconds += 3600; // 加上重复的1小时（3600秒）
                    }
                }
            }

            // 计算分钟数，不足1分钟按1分钟计算
            long minutes = seconds / 60;
            if (seconds % 60 > 0) {
                minutes++; // 不足1分钟按1分钟计算
            }

            return minutes;
    }

    /**
     * 计算通话费用
     */
    public static double calculateCallCost(LocalDateTime startTime, LocalDateTime endTime) {

        long minutes = calculateCallDuration(startTime, endTime);

        if(minutes ==0 || minutes > 30*60){
            throw new IllegalArgumentException("通话时长不合法");
        }
        else if (minutes <= 20 && minutes > 0) {
            return minutes * 0.05; // 每分钟0.05美元
        }
        else{
            return 1.00 + (minutes - 20) * 0.10; // 前20分钟1美元，超出部分每分钟0.10美元
        }

    }
}
